﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using Support.DTO;
using Support.Enums;
using DataAccess;

namespace SindicatoLuzYFuerza.WebService
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {
        #region PARENTESCOS

        [WebMethod]
        public List<ParentescoDTO> GetParentescos()
        {
            var parentescoDAL = new ParentescoDAL();
            return parentescoDAL.GetParentescos();
            //return "hola";
        }

        [WebMethod]
        public ParentescoDTO GetParentescoById(int parentescoId)
        {
            var parentescoDAL = new ParentescoDAL();
            return parentescoDAL.GetParentescoById(parentescoId);
        }

        #endregion

        #region USUARIOS

        [WebMethod]
        public ERoles IniciarSesion(string userName, string password)
        {
            //Super Harcodeado, hacerle más copado despues...
            return ERoles.Jefe;
        }

        [WebMethod]
        public UsuarioDTO GetUsuario(string username, string password)
        {
            var usuarioDAL = new UsuarioDAL();
            return usuarioDAL.GetUsuario(username, password);
        }

        [WebMethod]
        public int GuardarUsuario(UsuarioDTO user)
        {
            var usuarioDAL = new UsuarioDAL();
            return usuarioDAL.GuardarUsuario(user);
        }

        [WebMethod]
        public bool ModificarUsuario(UsuarioDTO user)
        {
            var usuarioDAL = new UsuarioDAL();
            return usuarioDAL.ModificarUsuario(user);
        }

        [WebMethod]
        public int CambiarPassword(int userId, string oldPassword, string newPassword)
        {
            var usuarioDAL = new UsuarioDAL();
            return usuarioDAL.CambiarPassword(userId, oldPassword, newPassword);
        }

        [WebMethod]
        public int ActivarUsuario(int userId, string newPassword)
        {
            var usuarioDAL = new UsuarioDAL();
            return usuarioDAL.ActivarUsuario(userId, newPassword);
        }

        [WebMethod]
        public List<RolDTO> GetRoles()
        {
            var usuarioDAL = new UsuarioDAL();
            return usuarioDAL.GetRoles();
        }

        [WebMethod]
        public List<UsuarioDTO> BuscarUsuarios(string nombre, string apellido, string username, int rol)
        {
            var usuarioDAL = new UsuarioDAL();
            return usuarioDAL.BuscarUsuarios(nombre, apellido, username, rol);
        }

        [WebMethod]
        public bool EliminarUsuario(int usuarioId)
        {
            var usuarioDAL = new UsuarioDAL();
            return usuarioDAL.EliminarUsuario(usuarioId);
        }

        [WebMethod]
        public UsuarioDTO ObtenerUsuarioPorId(int usuarioId)
        {
            var usuarioDAL = new UsuarioDAL();
            return usuarioDAL.ObtenerUsuarioPorId(usuarioId);
        }
        

        #endregion

        #region ESTADOS CIVILES

        [WebMethod]
        public List<EstadoCivilDTO> GetEstadosCiviles()
        {
            var estadoCivilDAL = new EstadoCivilDAL();
            return estadoCivilDAL.GetEstadosCiviles();
        }

        #endregion

        #region EMPRESAS

        [WebMethod]
        public List<EmpresaDTO> GetEmpresas()
        {
            var empresaDAL = new EmpresaDAL();
            return empresaDAL.GetEmpresas();
        }

        [WebMethod]
        public int GuardarEmpresa(EmpresaDTO emp)
        {
            var empresaDAL = new EmpresaDAL();
            return empresaDAL.GuardarEmpresa(emp);
        }

        [WebMethod]
        public EmpresaDTO GetEmpresaById(int empresaId)
        {
            var empresaDAL = new EmpresaDAL();
            return empresaDAL.GetEmpresaById(empresaId);
        }

        #endregion
       
        #region  AFILIADOS

        [WebMethod]
        public int GuardarAfiliado(AfiliadoDTO afiliado)
        {
            var afiliadoDAL = new AfiliadoDAL();
            return afiliadoDAL.GuardarAfiliado(afiliado);
        }

        [WebMethod]
        public AfiliadoDTO ObtenerAfiliadoPorId(int afiliadoId)
        {
            var afiliadoDAL = new AfiliadoDAL();
            return afiliadoDAL.ObtenerAfiliadoPorId(afiliadoId);
        }

        [WebMethod]
        public bool DesactivarAfiliado(int afiliadoId, string motivo, DateTime fechaExcepcion)
        {
            var afiliadoDAL = new AfiliadoDAL();
            return afiliadoDAL.DesactivarAfiliado(afiliadoId, motivo, fechaExcepcion);
        }

        [WebMethod]
        public bool ActivarAfiliado(int afiliadoId)
        {
            var afiliadoDAL = new AfiliadoDAL();
            return afiliadoDAL.ActivarAfiliado(afiliadoId);
        }

        
        
        [WebMethod]
        public List<AfiliadoDTO> GetAfiliado(string nombre, string apellido, string nroDocumento, string nroInterno)
        {
            var afiliadoDAL = new AfiliadoDAL();
            return afiliadoDAL.GetAfiliado(nombre, apellido, nroDocumento, nroInterno);
        }

        [WebMethod]
        public int UpdateAfiliado(AfiliadoDTO afiliado)
        {
            var afiliadoDAL = new AfiliadoDAL();
            return afiliadoDAL.UpdateAfiliado(afiliado);
        }

        [WebMethod]
        public int GuardarOrden(OrdenDTO orden)
        {
            var afiliadoDAL = new AfiliadoDAL();
            return afiliadoDAL.GuardarOrden(orden);
        }

        #endregion

        #region LOCALIDADES Y PROVINCIAS

        [WebMethod]
        public List<LocalidadDTO> GetLocalidadesByProvId(int provinciaId)
        {
            var localidadDAL = new LocalidadDAL();
            return localidadDAL.GetLocalidadesByProvId(provinciaId);
        }

        [WebMethod]
        public List<ProvinciaDTO> GetProvincias()
        {
            var provinciaDAL = new ProvinciaDAL();
            return provinciaDAL.GetProvincias();
        }

        [WebMethod]
        public LocalidadDTO GetLocalidadById(int localidadId)
        {
            var localidadDAL = new LocalidadDAL();
            return localidadDAL.GetLocalidadById(localidadId);
        }

        [WebMethod]
        public ProvinciaDTO GetProvinciaById(int provinciaId)
        {
            var provinciaDAL = new ProvinciaDAL();
            return provinciaDAL.GetProvinciaById(provinciaId);
        }

        #endregion

        #region TIPOS DE PLAN

        [WebMethod]
        public List<TipoPlanDTO> GetTiposPlan()
        {
            var tipoPlanDAL = new TipoPlanDAL();
            return tipoPlanDAL.GetTiposPlan();
        }

        [WebMethod]
        public List<TipoPlanDTO> ConusltarPlan()
        {
            var tipoPlanDAL = new TipoPlanDAL();
            return tipoPlanDAL.GetTiposPlan();
        }
        [WebMethod]
        public List<TipoPlanDTO> TipoPlan_BuscarXNombre(string nombre)
        {
            var tipoPlanDAL = new TipoPlanDAL();
            return tipoPlanDAL.PlanBuscarXNombre(nombre);
        }

        [WebMethod]
        public int InsertarPlan(TipoPlanDTO plan)
        {
            var tipoPlanDAL = new TipoPlanDAL();
            return tipoPlanDAL.InsertarTipo(plan);
        }

        [WebMethod]
        public void UpdateTPlan(TipoPlanDTO plan)
        {
            var tipoPlanDAL = new TipoPlanDAL();
            tipoPlanDAL.UpdateTipoPlan(plan);
        }
        [WebMethod]
        public bool EliminarPlan(int PlanId)
        {
            var tipoPlanDAL = new TipoPlanDAL();
            return tipoPlanDAL.EliminarPlan(PlanId);
        }
        #endregion

        #region TIPOS DE ORDEN

        [WebMethod]
        public List<TipoOrdenDTO> GetTiposOrden()
        {
            var tipoOrdenDAL = new TipoOrdenDAL();
            return tipoOrdenDAL.GetTiposOrden();
        }
        

        [WebMethod]
        public string GuardarTipoOrden(TipoOrdenDTO tipoOrden)
        {
            var tipoOrdenDAL = new TipoOrdenDAL();
            return tipoOrdenDAL.GuardarTipoOrden(tipoOrden);
        }

        [WebMethod]
        public List<TipoOrdenDTO> GetOrdenesByPlanId(int tipoPlanId)
        {
            var tipoOrdenDAL = new TipoOrdenDAL();
            return tipoOrdenDAL.GetOrdenesByTipoPlanId(tipoPlanId);
        }

        [WebMethod]
        public List<TipoOrdenDTO> BuscarTipoOrden(string filtro)
        {
            var tipoOrdenDAL = new TipoOrdenDAL();
            return tipoOrdenDAL.BuscarTipoOrden(filtro);
        }

        [WebMethod]
        public bool EditarTipoOrden(TipoOrdenDTO tipoOrden)
        {
            var tipoOrdenDAL = new TipoOrdenDAL();
            return tipoOrdenDAL.EditarTipoOrden(tipoOrden);
        }

        #endregion

        #region NOMENCLADOR

        [WebMethod]
        public List<NomencladorDTO> GetNomencladores()
        {
            var dal = new NomencladorDAL();
            return dal.GetNomencladores();
        }
        [WebMethod]
        public List<NomencladorDTO> BuscarNomenXCod1(string nrocodigo)
        {
            var dal = new NomencladorDAL();
            return dal.BuscarNomeCodigo(nrocodigo);
        }
        [WebMethod]
        public List<NomencladorDTO> Nomenclador_Buscar(string codigo, String desc)
        {
            var dal = new NomencladorDAL();
            return dal.Nomenclador_Buscar(codigo, desc);
   
        }
        [WebMethod]
        public int InsertarNomenclador(NomencladorDTO NomenIng)
        {
            var dal = new NomencladorDAL();
            return dal.InsertarNomenclador(NomenIng);
        }
          
        [WebMethod]
        public void Nomenclador_Modificar(NomencladorDTO NomenIng)
        {
            var dal = new NomencladorDAL();
            dal.ModificarNomenclador(NomenIng);
        }
        [WebMethod]
        public void Nomenclador_Eliminar(int IdNomen)
        {
            var dal = new NomencladorDAL();
            dal.EliminarNomenclador(IdNomen);
        }

        #endregion

        #region INFORMES

        [WebMethod]
        public List<InformeOrdenVendidaDTO> InformeOrdenesVendidas(DateTime fechaInicio, DateTime fechaFin)
        {
            var informeDAL = new InformeDAL();
            return informeDAL.InformeOrdenesVendidas(fechaInicio, fechaFin);
        }

        [WebMethod]
        public List<InformePatologiaDTO> InformePatologias(DateTime fechaInicio, DateTime fechaFin)
        {
            var informeDAL = new InformeDAL();
            return informeDAL.InformePatologias(fechaInicio, fechaFin);
        }

        #endregion

        #region HISTORIA CLINICA

        [WebMethod]
        public HistoriaClinicaDTO BuscarHistoriaPorAfiliadoId(int afiliadoId)
        {
            var historiaDAL = new HistoriaClinicaDAL();
            return historiaDAL.BuscarPorAfiliadoId(afiliadoId);
        }

        [WebMethod]
        public List<TipoAntecedenteDTO> GetTiposAntecedentes()
        {
            var antecedenteDAL = new TipoAntecedenteDAL();
            return antecedenteDAL.GetTiposAntecedentes();
        }

        [WebMethod]
        public List<TipoHabitoToxicoDTO> GetTiposHabitosToxicos()
        {
            var habitosDAL = new TipoHabitoToxicoDAL();
            return habitosDAL.GetTiposHabitosToxicos();
        }

        [WebMethod]
        public int NuevaHistoria(HistoriaClinicaDTO historia)
        {
            var historiaDal = new HistoriaClinicaDAL();
            var historiaId = historiaDal.GuardarHistoriaClinica(historia);

            AsignarIds(historia, historiaId);

            var antecedentesDal = new AntecedenteDAL();
            foreach (var ant in historia.Antecedentes)
            {
                ant.HistoriaClinicaId = historiaId;
                antecedentesDal.GuardarAntecedente(ant);
            }

            var consultaDal = new ConsultaInicialDAL();
            consultaDal.GuardarConsultaInicial(historia.ConsultaInicial);

            var habitosToxicosDal = new HabitoToxicoDAL();
            foreach (var ht in historia.HabitosToxicos)
            {
                ht.HistoriaId = historiaId;
                habitosToxicosDal.GuardarHabitoToxico(ht);
            }

            var sistemaNerviosoDal = new SistemaNerviosoDAL();
            sistemaNerviosoDal.GuardarSistemaNervioso(historia.SistemaNervioso);

            var examenVariosDal = new ExamenVariosDAL();
            examenVariosDal.GuardarExamenVarios(historia.ExamenVarios);

            var abdomenDal = new AbdomenDAL();
            abdomenDal.GuardarAbdomen(historia.Abdomen);

            var cuelloDal = new CuelloDAL();
            cuelloDal.GuardarCuello(historia.Cuello);

            var osteoDal = new OsteoMuscularDAL();
            osteoDal.GuardarOsteoMuscular(historia.OsteoMuscular);

            var signosDal = new SignosVitalesDAL();
            signosDal.GuardarSignosVitales(historia.SignosVitales);

            return historiaId;
        }

        private static void AsignarIds(HistoriaClinicaDTO historia, int historiaId)
        {
            historia.ConsultaInicial.HistoriaId = historiaId;
            historia.SistemaNervioso.HistoriaId = historiaId;
            historia.ExamenVarios.HistoriaId = historiaId;
            historia.Abdomen.HistoriaId = historiaId;
            historia.Cuello.HistoriaId = historiaId;
            historia.OsteoMuscular.HistoriaId = historiaId;
            historia.SignosVitales.HistoriaId = historiaId;
        }


        [WebMethod]
        public List<AntecedenteDTO> ObtenerAntecedentesPorHistoriaId(int historiaId)
        {
            var antecedentesDAL = new AntecedenteDAL();
            return antecedentesDAL.ObtenerPorHistoriaId(historiaId);
        }

        [WebMethod]
        public List<HabitoToxicoDTO> ObtenerHabitosPorHistoriaId(int historiaId)
        {
            var habitosDAL = new HabitoToxicoDAL();
            return habitosDAL.ObtenerPorHistoriaId(historiaId);
        }

        [WebMethod]
        public List<EvolucionClinicaDTO> ObtenerEvolucionesPorHistoriaId(int historiaId)
        {
            var evolucionesDAL = new EvolucionClinicaDAL();
            return evolucionesDAL.ObtenerPorHistoriaId(historiaId);
        }

        [WebMethod]
        public void ModificarHistoria(HistoriaClinicaDTO HC)
        {
            AsignarIds(HC, HC.Id);

            var abdomenDal = new AbdomenDAL();
            abdomenDal.Modificar(HC.Abdomen);

            var consultaDal = new ConsultaInicialDAL();
            consultaDal.Modificar(HC.ConsultaInicial);

            var cuelloDAL = new CuelloDAL();
            cuelloDAL.Modificar(HC.Cuello);

            var examenVariosDal = new ExamenVariosDAL();
            examenVariosDal.Modificar(HC.ExamenVarios);

            var historiaDal = new HistoriaClinicaDAL();
            historiaDal.Modificar(HC);

            var osteoDal = new OsteoMuscularDAL();
            osteoDal.Modificar(HC.OsteoMuscular);

            var signosDal = new SignosVitalesDAL();
            signosDal.Modificar(HC.SignosVitales);

            var sistemaDal = new SistemaNerviosoDAL();
            sistemaDal.Modificar(HC.SistemaNervioso);

            var habitosDal = new HabitoToxicoDAL();
            habitosDal.EliminarPorHistoriaId(HC.Id);

            var antecedentesDal = new AntecedenteDAL();
            antecedentesDal.EliminarPorHistoriaId(HC.Id);

            var evolucionesDal = new EvolucionClinicaDAL();
            evolucionesDal.EliminarPorHistoriaId(HC.Id);

            foreach (var ant in HC.Antecedentes)
            {
                ant.HistoriaClinicaId = HC.Id;
                antecedentesDal.GuardarAntecedente(ant);
            }

            foreach (var ht in HC.HabitosToxicos)
            {
                ht.HistoriaId = HC.Id;
                habitosDal.GuardarHabitoToxico(ht);
            }

            foreach (var ev in HC.EvolucionesClinicas)
            {
                if (!string.IsNullOrEmpty(ev.Contenido))
                {
                    ev.HistoriaId = HC.Id;
                    evolucionesDal.Guardar(ev);
                }
            }
        }

        [WebMethod]
        public int GuardarEvolucion(EvolucionClinicaDTO evolucion)
        {
            var dal = new EvolucionClinicaDAL();
            return dal.Guardar(evolucion);
        }

        [WebMethod]
        public bool EliminarHistoria(int historiaId)
        {
            try
            {
                var abdomenDal = new AbdomenDAL();
                abdomenDal.Eliminar(historiaId);

                var antecedenteDal = new AntecedenteDAL();
                antecedenteDal.EliminarPorHistoriaId(historiaId);

                var consultaDal = new ConsultaInicialDAL();
                consultaDal.Eliminar(historiaId);

                var cuelloDal = new CuelloDAL();
                cuelloDal.Eliminar(historiaId);

                var osteoDal = new OsteoMuscularDAL();
                osteoDal.Eliminar(historiaId);

                var signosDal = new SignosVitalesDAL();
                signosDal.Eliminar(historiaId);

                var sistemaDal = new SistemaNerviosoDAL();
                sistemaDal.Eliminar(historiaId);

                var examenVariosDal = new ExamenVariosDAL();
                examenVariosDal.Eliminar(historiaId);

                var habitosDal = new HabitoToxicoDAL();
                habitosDal.EliminarPorHistoriaId(historiaId);

                var evolucionesDal = new EvolucionClinicaDAL();
                evolucionesDal.EliminarPorHistoriaId(historiaId);

                var historiaDal = new HistoriaClinicaDAL();
                historiaDal.Eliminar(historiaId);

                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        #endregion

        #region PATOLOGIA

        [WebMethod]
        public List<PatologiaDTO> GetPatologias()
        {
            var patologiaDAL = new PatologiaDAL();
            return patologiaDAL.GetPatologias();
        }

        [WebMethod]
        public int GuardarPatologia(PatologiaDTO patologia)
        {
            var patologiaDAL = new PatologiaDAL();
            return patologiaDAL.GuardarPatologia(patologia);
        }

        [WebMethod]
        public int GuardarEstadisticaPatologia(int patologiaId)
        {
            var patologiaDAL = new PatologiaDAL();
            return patologiaDAL.RegistrarEstadistica(patologiaId);
        }

        #endregion
    }
}